#!/bin/bash

# 文件描述：使用 valgrind 验证指定的 C++ 程序，输出日志保存至 log 文件夹中
# 使用方法：chmod +x run_valgrind.sh && ./run_valgrind.sh memory_leak.cpp


# 获取 C++ 源文件路径作为第一个命令行参数
SOURCE_FILE=$1

# 检查是否提供了文件参数
if [ -z "$SOURCE_FILE" ]; then
    echo "请提供要检测的 C++ 源文件！"
    echo "用法：./run_valgrind.sh <source_file.cpp>"
    exit 1
fi

# 检查文件是否存在
if [ ! -f "$SOURCE_FILE" ]; then
    echo "文件 $SOURCE_FILE 不存在，请检查文件路径。"
    exit 1
fi

# 创建 log 文件夹（如果它不存在）
mkdir -p ./log

# 获取当前时间戳，格式为：YYYY-MM-DD_HH-MM-SS
timestamp=$(date +"%Y-%m-%d_%H-%M-%S")

# 从文件名获取可执行文件名（去掉扩展名）
EXEC_FILE=$(basename "$SOURCE_FILE" .cpp)

# 编译指定的文件
g++ "$SOURCE_FILE" -g -o "$EXEC_FILE"

# 检查是否成功编译
if [ $? -ne 0 ]; then
    echo "编译失败！请检查你的代码。"
    rm -f "$EXEC_FILE"
    exit 1
fi

# 使用 valgrind 运行程序，并将日志保存到 log 文件夹中
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=./log/valgrind_log_$timestamp.txt ./$EXEC_FILE
VALGRIND_EXIT_STATUS=$?

# 检查 valgrind 执行是否成功
if [ $VALGRIND_EXIT_STATUS -eq 0 ]; then
    echo "Valgrind 检查完成，日志已保存到 ./log/valgrind_log_$timestamp.txt"
else
    echo "Valgrind 执行失败，错误码：$VALGRIND_EXIT_STATUS，请检查错误信息。"
    rm -f "$EXEC_FILE"
    exit 1
fi

# 清理生成的可执行文件
rm -f "$EXEC_FILE"
